JWT authentication bypass via weak signing key
This lab uses a JWT-based mechanism for handling sessions. It uses an extremely weak secret key to both sign and verify tokens. This can be easily brute-forced using a wordlist of common secrets.
To solve the lab, first brute-force the website's secret key. Once you've obtained this, use it to sign a modified session token that gives you access to the admin panel at /admin, then delete the user carlos.
You can log in to your own account using the following credentials: wiener:peter
Tip
We recommend familiarizing yourself with how to work with JWTs in Burp Suite before attempting this lab.
We also recommend using hashcat to brute-force the secret key. For details on how to do this, see Brute forcing secret keys using hashcat.
Al iniciar sesion mediante una solicitud o request POST a la ruta /login la response nos entrega
HTTP/2 302 Found
Location: /my-account?id=wiener
Set-Cookie: session=eyJraWQiOiIxMGI5MGQzNi00MWNkLTQxYWUtOTVkOC00ZGViZGZkMGE2ZWIiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc1NzE5OTAwNiwic3ViIjoid2llbmVyIn0.ElU8qAgh_XyDmKJSLCQPoOt0G7C9pAcXffY8kz5seeE; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Content-Length: 0
Ahora probaremos que tan fuerte es la password o la clave de firmado la signature key mediante hashcat para crackearlo.
https://books.spartan-cybersec.com/web/jwt/lab-3-jwt-authentication-bypass-via-weak-signing-key Puedes utilizar grep para consultar el numero que maneja hashcat para identificar el modulo correspondiente a JWTs.
hashcat -h | grep -i jwt
luego utilizar el siguiente comando de hashcat con los parametros necesarios:
└─# hashcat -a 0 -m 16500 eyJraWQiOiI2MzIwYzUyOS02ZjNhLTQyMWEtYmY3NC0zYzg4ZWFiZjJjNzUiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTcxNzQ1MTI3Niwic3ViIjoid2llbmVyIn0.OzQHzaGE4xN3q5acIT-Wboc7JevVN64zNiZE1dH7WOo /usr/share/wordlists/rockyou.txt
Una alternativa a lo anterior es utilizar la herramienta escrita en python jwt_tool.py con el parametro -C -d y un wordlist
python3 jwt_tool.py eyJraWQiOiI2MzIwYzUyOS02ZjNhLTQyMWEtYmY3NC0zYzg4ZWFiZjJjNzUiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTcxNzQ1MTI3Niwic3ViIjoid2llbmVyIn0.OzQHzaGE4xN3q5acIT-Wboc7JevVN64zNiZE1dH7WOo -C -d /usr/share/wo
rdlists/rockyou.txt
password : secret1
https://www.youtube.com/watch?v=ov9yT4WAuzI Luego en Burpsuite utilizamos una request que contenga el jwt para enviarlo a repeater, ahi utilizamos la extension "JSON Web Token" con "Recalculate Signature" le asignamos la password que vendria a ser la signature key o clave de firma para firmar asi el jwt con el campo sub manipulado con el valor "administrator". Presta atencion a la GET request ya que puedes estar realizar una GET request sobre el usuario wiener y no interpretarias la respuesta correctamente, en mi caso probe inicialmente con /my-account sin parametros en la url. Luego solicite la ruta /admin para luego realizar un POST para eliminar el registro que pide el ejercicio.
https://red.tymyrddin.dev/docs/in/app/burp/jwt/3
La otra alternativa es utilizar Burp Decoder junto con la extension de la BApp de Burpsuite llamada JWT Editor utiliza Burp decoder para codificar en base64 la signing key brutforceada "secret1" en otras palabras codifica "secret1" en base64; el resultado codificado se utilizara como input o entrada para tener un signing key o symmetric key.
La extension JWT Editor tiene 2 tabs: una junto a todas las demas principales y otra dentro de la tab de Repeater. Utilizaremos la primera para crear la clave simetrica; primero presiona en New Symmetric Key, luego en Generate y con lo generado modifica el campo "k" de "key" con el valor codificado en base64, finalmente dale en OK y esto te genera una llave simetrica como un registro en la tabla. Despues de ello dirigete a la request del Repeater y en la sub tab de la extension dale al boton inferior "Sign" para asi elegir el registro que vendria a ser la clave simetrica creada previamente y asegurate de que la opcion "dont modify header" este seleccionada, modifica el sub en administrator y envia la request.
Lo que hemos aprendido, repasado:
- Las claves de signature pueden ser vulnerables a bruteforcing, lo que permite firmar tus propios Json Web Tokens